#!/usr/bin/perl
#
# Este script devuelve los hosts de una zona del DNS
#
# Argumentos:
#  1) zona_del_dns: gestion|docencia|wifi
#  


 # Comprobar argumentos...
 if ( 0 != $#ARGV ) {
    print STDERR "ERROR: No has pasado la zona <gestion|docencia|wifi>\n";
    exit 2;
 }
 
 # Averiguar el master del DNS que debemos usar...
 $master="localhost";
 $zona=$ARGV[0];
 if ( "gestion" eq $ARGV[0] ) {
    $master="pd-ges";
    $zona="gestion.educarm.net";
 }elsif ( "docencia" eq $ARGV[0] ) {
    $master="pd-doc";
    $zona="docencia.educarm.net";
 }elsif ( "wifi" eq $ARGV[0] ) {
    $master="pd-wifi";
    $zona="wifi.educarm.net";
 }

 # Para obtener las ruta absoluta del directorio de los scripts
 use File::Basename;
 use Cwd 'abs_path';
 $dirname=dirname(abs_path($0));
 $parentDir=dirname($dirname);

 # Para los temporales
 $rnd=rand(1000000);
 $tmpFile="/tmp/getZoneData_$$_$rnd";

 # Cargar el fichero de Blacklist
 open (FILE, "$parentDir/Editables.BlackList");
 @blackList=<FILE>;
 close FILE;
 

 # Leer datos de la zona
 open(ZONEDATA,"dig \@$master $zona AXFR | grep 'IN' | sort | " ) || die "ERROR: No puedo obtener la zona [$zona]\n";
### open(ZONEDATA,"cat $parentDir/../data/zona_$zona | grep 'IN' | sort |" ) || die "ERROR: No puedo obtener la zona [$zona]\n";

 # Ir leyendo el fichero de zonas
 while( chomp($linea=<ZONEDATA>) ) { 
    $edit="SI";
    # Comprobar que sea mostrable :P
    if ( $linea=~m/^([^\.]+)\.$zona\.\s+\d+\s+IN\s+A\s+(\d\S+)\s*$/ ) {
       $nombre=$1;
       $ip=$2;
       # Saber si es editable o no...
       if ( grep( /^$nombre$/, @blackList ) ) {
          $edit="NO";
       }
       print lc($nombre)."#HOST#$ip#$edit#$nombre#\n";
    }elsif ( $linea=~m/^([^\.]+)\.$zona\.\s+\d+\s+IN\s+CNAME\s+(\S+)\.\s*$/ ) {
       $nombre=$1;
       $ip=$2;
       if ( $ip =~m/^([^\.]+)\.$zona/) {
          $ip=$1;
       }
       # Saber si es editable o no...
       if ( grep( /^$nombre$/, @blackList ) ) {
          $edit="NO";
       }
       print lc($nombre). "#ALIAS#$ip#$edit#$nombre#\n";
    }
 }
 close(ZONEDATA);
